#ifndef BASE_SOCKETFACTORY_H__
#define BASE_SOCKETFACTORY_H__

#include "socket.h"
#include "asyncsocket.h"

namespace base {

	class SocketFactory {
	public:
		virtual ~SocketFactory() {}

		// Returns a new socket for blocking communication.  The type can be
		// SOCK_DGRAM and SOCK_STREAM.
		// TODO: C++ inheritance rules mean that all users must have both
		// CreateSocket(int) and CreateSocket(int,int). Will remove CreateSocket(int)
		// (and CreateAsyncSocket(int) when all callers are changed.
		virtual Socket* CreateSocket(int type) = 0;
		virtual Socket* CreateSocket(int family, int type) = 0;
		// Returns a new socket for nonblocking communication.  The type can be
		// SOCK_DGRAM and SOCK_STREAM.
		virtual AsyncSocket* CreateAsyncSocket(int type) = 0;
		virtual AsyncSocket* CreateAsyncSocket(int family, int type) = 0;
	};

} // namespace base

#endif // BASE_SOCKETFACTORY_H__